obsah dvou souboru
Otázka od: Radek
8. 1. 2004 16:43
Ahoj,
potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru stejny -
je na to nejaka finta ? Vypocitavat CRC
se me moc nechce.
Radek
Odpovedá: Petr Zahradnik
8. 1. 2004 16:57
Puvodni zprava ze dne 8.1.2004:
> potreboval bych nejak jednoduse zjistit jestli je obsah dvou
> souboru stejny - je na to nejaka finta ? Vypocitavat CRC
Hash - otisk dat.
> se me moc nechce.
A co by se ti chtelo?
Petr Zahradnik, pocitacovy expert
==========================================================
Petr Zahradnik, Computer Laboratory
Obvodova 740/14, 400 07 Usti nad Labem
telefon: 475 501 627, mobil: 602 409 601, fax: 475 511 338
web: http://www.clexpert.cz, e-mail: clexpert@clexpert.cz
ICQ: 21215917, MSN: clexpert@clexpert.cz
==========================================================
Odpovedá: Tomas Kminek
8. 1. 2004 18:01
> potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru
stejny - je na to nejaka finta ?
Tak tohle je bez finty:
function CompareFileContent(const Filename1, Filename2: String): Boolean;
var
P1, P2: Pointer;
hf, hm: THandle;
size: DWORD;
begin
Result := False;
hf := FileOpen(FileName1, fmOpenRead or fmShareDenyNone);
if hf = INVALID_HANDLE_VALUE then
Raise Exception.CreateFmt('Cannot open %s', [FileName1]);
size := GetFileSize (hf, nil);
hm := CreateFileMapping(hf, nil, PAGE_READONLY, 0, 0, nil);
CloseHandle (hf);
if hm = 0 then
raise Exception.Create('Cannot create file mapping.');
P1:= MapViewOfFile (hm, FILE_MAP_READ, 0, 0, 0);
CloseHandle (hm);
if P1 = nil then
raise Exception.Create('Cannot get file mapping.');
{2. soubor}
try
hf := FileOpen(FileName2, fmOpenRead or fmShareDenyNone);
if hf = INVALID_HANDLE_VALUE then
Raise Exception.CreateFmt('Cannot open %s', [FileName1]);
if size <> GetFileSize (hf, nil) then
begin
CloseHandle (hf);
Exit;
end;
hm := CreateFileMapping(hf, nil, PAGE_READONLY, 0, 0, nil);
CloseHandle (hf);
if hm = 0 then
raise Exception.Create('Cannot create file mapping.');
P2:= MapViewOfFile (hm, FILE_MAP_READ, 0, 0, 0);
CloseHandle (hm);
if P2 = nil then
raise Exception.Create('Cannot get file mapping.');
try
Result := CompareMem(P1, P2, size);
finally
UnmapViewOfFile (P2);
end;
finally
UnmapViewOfFile (P1);
end;
end;
TK
Odpovedá: Petr Brant
8. 1. 2004 17:30
Tak zkus pouzit hash - MD5 apod., muzu poslat zdrojak. Ale je v podstate
jedno, jestli nactes soubor a zavolas CRC1:= GetCRC(File1) anebo Hash1:=
MD5(File1). Kazdopadne musis soubor nejakym zpusobem nacist, to obejit
nepujde.
RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant <http://web.redbox.cz/petr.brant>
> potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru
> stejny - je na to nejaka finta ? Vypocitavat CRC
> se me moc nechce.
>
Odpovedá: Karel Rys
8. 1. 2004 18:32
Petr Brant dne 8 Jan 2004 v 17:05:
> Tak zkus pouzit hash - MD5 apod., muzu poslat zdrojak. Ale je v
> podstate jedno, jestli nactes soubor a zavolas CRC1:= GetCRC(File1)
> anebo Hash1:= MD5(File1). Kazdopadne musis soubor nejakym zpusobem
> nacist, to obejit nepujde.
Spise bych se drzel toho, co poslal p. Kminek - nejsou tam vypocty navic, bude
to rychlejsi. Navic
pokud to zjistit rozdil na 1. bajtu, nebude to zbytecne nacitat a pocitat cely
(stomegovy...)
soubor.
Karel Rys
Odpovedá: Jan Fiala
8. 1. 2004 18:14
8.1.2004 Karel Rys:
Spise bych se drzel toho, co poslal p. Kminek - nejsou tam
> vypocty navic, bude to rychlejsi. Navic
> pokud to zjistit rozdil na 1. bajtu, nebude to zbytecne nacitat a pocitat
cely (stomegovy...)
> soubor.
Jeste bych tam udelal napred podminku na porovnani velikosti obou
souboru. K tomu nemusis taky soubory nacitat a muzes si usetrit
mapovani.
--
Jan Fiala
mailto:jan.fiala@wo.cz